#pragma once

namespace CO { namespace MyGroupNamespace { namespace MyPackageNamespace {

class MyProtocol :  public SpiFoundation::RoomFW::ContractChecker
{
public:

	//
	// Constructor/Destructor
	//
	MyProtocol(bool conjugate, bool isLogged = true);
	virtual ~MyProtocol(void);
	
	//
	// IContractChecker overrides.
	//
	virtual bool validMessage(SpiFoundation::RoomFW::MessageID messageID, const SpiFoundation::RoomFW::IPayloadSP& payload) const;
	virtual const char* messageName(SpiFoundation::RoomFW::MessageID messageID) const;
	virtual SpiFoundation::RoomFW::ContractTypeId getTypeID() const;
	virtual SpiFoundation::RoomFW::IContractCheckerSPC getConjugate(void) const;
	virtual SpiFoundation::RoomFW::IPayloadSP createPayload(SpiFoundation::RoomFW::MessageID messageID) const;

	//
	// TODO:  Add message Id's.
	//
	enum MessageIds
	{
		//
		// In message Id's.
		//
		IN_MESSAGE_1,
		IN_MESSAGE_2,
		IN_MESSAGE_3,
		IN_ERROR_1,
		IN_ERROR_2,
		IN_ERROR_3,
		IN_ERROR_4,
		IN_ERROR_5,
		I_AM_READY_ACK,

		//
		// Out message Id's.
		//
		OUT_MESSAGE_1,
		OUT_MESSAGE_2,
		OUT_MESSAGE_3,
		I_AM_READY,
		HARDWARE_DISABLED_EVENT,
		SW_ERROR_EVENT,
		HW_ERROR_EVENT,
		OUT_ERROR
	};
};
//
// TODO:  Add a smart pointer to const typedef for your class.
//
typedef ::boost::shared_ptr<const MyProtocol> MyProtocolSPC;

//
// TODO:  Typedef a null deleter to make it easier to return a value attribute.
//
typedef SpiFoundation::RoomFW::NullDeleter<const MyProtocol> MyProtocolNullDeleter;

}}} // End namespace
